[ChatGPT]LINEかんたん操作だけでチャットAIキャラを自作し全世界に共有できるMyGPT for LINE Botを作ってみた
吉川@広島です。
ChatGPTの流行により、自分だけのAIキャラクターを設定して共有する動きが活発になっています。
「俺様口調で」→chatGPT「フッ、そんな些細なことオレに聞くなよな」今話題の『chatGPT』で遊んだりしてみた - Togetter
様々な方がアイデアを巡らせるこの状況で、
- Web版ChatGPTのスクリーンショットを共有するだけでなく、実際に他人と自分のAIを会話させる形で使ってもらいたい
というニーズがあるのではないかと思いました。
ただ、アイデアを持っているすべての人がAIキャラを設定して共有するにはまだやや敷居が高い現状もあるのかなと思います。すでに手前味噌ブログ含め、ChatGPT APIの使い方やそれと組み合わせるLINEボット作り方の解説記事はたくさん出ている状況ですが、それらを見ながら構築するにも、どうしても一定程度の専門知識は要求されるでしょう。
そこで、LINE上の簡単操作だけで自分だけのAIキャラを作り、他の人に共有も可能な MyGPT for LINE Bot というサービスを作ってみたので紹介します。
MyGPTのQRコード
以下をLINEアプリで読み込むことで利用開始できます。ご利用は無料です。友だちになると使い方が出てくるようになっています。
MyGPTのデモ
ツンデレな喋り方をする「ツン子」を作って呼び出してみます。
ツン子が作成でき、彼女と会話することができました!
MyGPTができること
- 自分が思いついたチャットAIキャラをかんたん操作で作れる
- 作ったAIキャラを他人に共有できる
- あなたとの会話文脈を覚える
- グループLINEに招待して盛り上がれる
思いついたチャットAIキャラをかんたん操作で作れる
デモで例示したように、思いついたチャットAIキャラをLINE上の簡単操作で作成することができます(更新と削除も可能)。あなたのアイデアを即、形にすることができます。
作ったキャラと会話する際は ハロー〇〇
とキャラ名を呼びかけます。
作ったAIキャラも他人に共有できる
作ったキャラを他人と会話させることができます。 ハロー○○
で呼び出して会話できるので、キャラ名を友達に教えるでも、TwitterなどのSNSで告知するでもOKです。
また、 キャラ一覧 新着
コマンドにより新着のキャラ一覧を見る機能があります。
もし反響があれば人気ランキング機能なども考えています(取らぬ狸の皮算用)。
文脈を覚える
過去10件程度の文脈を覚えるようにしています(こちらはより改善の余地ありで、詳細は後述)。
グループLINEに招待して盛り上がれる
MyGPTは友達とのグループLINEに招待できるよう設定しています。
そのため、友達とのグループLINEにMyGPTを招待し、大喜利的コンセプトのキャラを作って盛り上げる、または実用的なアシスタントキャラを入れて役立てるなどの使い方もできます。
また、グループLINEにチャットボットを招待した時のあるあるとして、すべての発言に反応してしまいうるさく感じるというのがありますが、この点、MyGPTは「ハロー○○」と呼びかけない限り反応しないため、うるさくなることもないでしょう。
招待して盛り上がるイメージ:
アイデアの例
形にできるアイデアの例として、ChatGPTに聞きつつ自分が思いついた範囲で、
- 汎用アシスタントAIキャラ
- フランス語講師AIキャラ
- 健康アドバイザAIキャラ
- ペアプログラマーAIキャラ
- お笑い枠キャラ
などなど。まだまだあると思います。
さらに使いこなすために
よりキャラを作り込もうとすると、「ツンデレな喋り方をして」のように1行設定だけだと物足りなくなってきます。
たくさん設定を書き込むほど、キャラの挙動は深く細かく制御できることが知られています。深津さんの記事などが参考に、ボリューミーなプロンプトに挑戦してみるのも良いでしょう。
ChatGPTにギルガメッシュ王の人格を与えるには?|深津 貴之 (fladdict)|note
MyGPTでは上記記事のような長文設定もインプットできます。
技術的な話
技術スタック
[ChatGPT API][AWSサーバーレス]ChatGPT APIであなたとの会話・文脈を覚えてくれるLINEボットを作る方法まとめ | DevelopersIO
基本上記ベースで、
- APIGW
- Lambda
- Node.js+TypeScript
- DynamoDB
で作りました。
DynamoDB周り
キャラを管理する必要があるため、上記記事のmessagesテーブルに加えcharactersテーブルを作っています。
messagesテーブル:
項目名 | 型名 | PK | GSI | 説明 |
---|---|---|---|---|
id | string | ○ | UUID V4 | |
content | string | 発言内容 | ||
typedAt | string | 発言日時 | ||
userId | string | ○ | 会話しているLINEユーザのID | |
targetCharacterName | string | 会話対象のキャラクター名 |
charactersテーブル:
項目名 | 型名 | PK | GSI | 説明 |
---|---|---|---|---|
name | string | ○ | キャラクター名 | |
settings | string | 設定内容 | ||
userId | string | キャラクター作者のLINEユーザID | ||
registeredAt | string | 登録日時 |
キャラテーブルはキャラ名が一意になるようにPK設計しています(自然キー設計)。作成時に条件付き書き込みすることで、作者でないユーザからキャラを上書きされるケースなどを防いでいます。
コードの一部抜粋:
await ddbDocClient.send( new PutCommand({ TableName: characterTableName, // zodによるパース Item: characterSchema.parse({ name: trimmedName, settings, userId, registeredAt, } satisfies Character), ConditionExpression: "attribute_not_exists(#name)", ExpressionAttributeNames: { "#name": "name", }, }) );
また、キャラ設定更新機能を別途用意しており、そこでも作者以外がキャラを更新できないよう制御しています。
文脈を覚える実装
ユーザとの会話文脈を愚直にすべて覚えようとすると、それまでの会話をすべてそろえてリクエストする必要があります。
[ChatGPT API][AWSサーバーレス]ChatGPT APIであなたとの会話・文脈を覚えてくれるLINEボットを作る方法まとめ | DevelopersIO
OpenAIクライアントをimportし、 model: "gpt-3.5-turbo" を指定することでChatGPT APIを利用できます。 createChatCompletion() を使うことで会話を得ることができるようです。また、APIはステートレスな作りになっており、これまでの会話を踏まえた返答を得るには過去発言を配列に入れてリクエストする必要があるようです。
そうするとある時点でChatGPT API側のトークン上限制限に引っかかってしまうという課題があります。
これを回避するために、以下のいずれかの方法で過去文脈を保持するのが良いのではと思います。
- 最新10件〜20件の会話のみ覚えるようにする
- 都度、過去会話の要約をChatGPTにお願いして文字数を圧縮しながら保持する
1は簡単お手軽、2は制御を作り込む手間こそかかるものの、より長い期間の文脈を保持できるでしょう。今回はスピード重視で1を採りました。
まとめ
以上、非エンジニアでも敷居ゼロで自分オリジナルなチャットAIを作れるサービスを開発しましたので紹介でした。
ぜひ遊んでみていただければと思います。